{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 调参第2.1步：粗调整树参数：max_depth & min_child_weight"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import xgboost as xgb\n",
    "from xgboost import XGBClassifier\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath + \"RentListingInquries_FE_train.csv\")\n",
    "test = pd.read_csv(dpath + \"RentListingInquries_FE_test.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据探索在第一步做过，因此略过，将训练数据集和类别标签进行分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "X_train = train.drop(['interest_level'], axis =1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "设定max_depth & min_child_weight初始值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [3, 5, 7, 9], 'min_child_weight': [1, 3, 5]}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# max_depth 3-10 步长为2，1-6 步长为2\n",
    "max_depth = range(3,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "利用gridsearch cv寻参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义xgboost参数并生成模型，保留第一步设置的最优n_estimators\n",
    "xgb2_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=248,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59899, std: 0.00378, params: {'max_depth': 3, 'min_child_weight': 1},\n",
       "  mean: -0.59887, std: 0.00400, params: {'max_depth': 3, 'min_child_weight': 3},\n",
       "  mean: -0.59946, std: 0.00393, params: {'max_depth': 3, 'min_child_weight': 5},\n",
       "  mean: -0.58989, std: 0.00367, params: {'max_depth': 5, 'min_child_weight': 1},\n",
       "  mean: -0.58956, std: 0.00348, params: {'max_depth': 5, 'min_child_weight': 3},\n",
       "  mean: -0.58898, std: 0.00331, params: {'max_depth': 5, 'min_child_weight': 5},\n",
       "  mean: -0.59113, std: 0.00355, params: {'max_depth': 7, 'min_child_weight': 1},\n",
       "  mean: -0.59169, std: 0.00397, params: {'max_depth': 7, 'min_child_weight': 3},\n",
       "  mean: -0.59072, std: 0.00430, params: {'max_depth': 7, 'min_child_weight': 5},\n",
       "  mean: -0.60951, std: 0.00555, params: {'max_depth': 9, 'min_child_weight': 1},\n",
       "  mean: -0.60246, std: 0.00575, params: {'max_depth': 9, 'min_child_weight': 3},\n",
       "  mean: -0.59861, std: 0.00433, params: {'max_depth': 9, 'min_child_weight': 5}],\n",
       " {'max_depth': 5, 'min_child_weight': 5},\n",
       " -0.5889815490394839)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 调用CV并输出参数在不同参数的分数的均值、方差以及最优参数和分数\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid = param_test2_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_1.grid_scores_, gsearch2_1.best_params_, gsearch2_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([198.19083729, 248.31174822, 228.73287163, 388.37614837,\n",
       "        319.48342338, 355.83176737, 381.45734396, 365.03281817,\n",
       "        374.73882966, 463.4852006 , 411.89240236, 381.81908164]),\n",
       " 'mean_score_time': array([1.17872663, 1.10652266, 0.98826857, 1.84310441, 1.32190619,\n",
       "        1.55986428, 2.19550614, 2.00416884, 1.8580832 , 4.22497745,\n",
       "        3.25737119, 2.34412699]),\n",
       " 'mean_test_score': array([-0.59898526, -0.59886802, -0.59945784, -0.58989107, -0.58956225,\n",
       "        -0.58898155, -0.59113031, -0.59168529, -0.59072224, -0.60950581,\n",
       "        -0.60246337, -0.59860937]),\n",
       " 'mean_train_score': array([-0.57517438, -0.57574408, -0.57631571, -0.50423692, -0.5098174 ,\n",
       "        -0.51419885, -0.39433937, -0.41818531, -0.43200419, -0.26780144,\n",
       "        -0.3158561 , -0.3443236 ]),\n",
       " 'param_max_depth': masked_array(data=[3, 3, 3, 5, 5, 5, 7, 7, 7, 9, 9, 9],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_min_child_weight': masked_array(data=[1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'max_depth': 3, 'min_child_weight': 1},\n",
       "  {'max_depth': 3, 'min_child_weight': 3},\n",
       "  {'max_depth': 3, 'min_child_weight': 5},\n",
       "  {'max_depth': 5, 'min_child_weight': 1},\n",
       "  {'max_depth': 5, 'min_child_weight': 3},\n",
       "  {'max_depth': 5, 'min_child_weight': 5},\n",
       "  {'max_depth': 7, 'min_child_weight': 1},\n",
       "  {'max_depth': 7, 'min_child_weight': 3},\n",
       "  {'max_depth': 7, 'min_child_weight': 5},\n",
       "  {'max_depth': 9, 'min_child_weight': 1},\n",
       "  {'max_depth': 9, 'min_child_weight': 3},\n",
       "  {'max_depth': 9, 'min_child_weight': 5}],\n",
       " 'rank_test_score': array([ 9,  8, 10,  3,  2,  1,  5,  6,  4, 12, 11,  7], dtype=int32),\n",
       " 'split0_test_score': array([-0.59276454, -0.5921946 , -0.59312431, -0.58326228, -0.58379225,\n",
       "        -0.58309847, -0.58416675, -0.5848048 , -0.58580333, -0.59883979,\n",
       "        -0.59294222, -0.59106707]),\n",
       " 'split0_train_score': array([-0.57573174, -0.57615275, -0.57689081, -0.50480932, -0.51017756,\n",
       "        -0.51459404, -0.39510511, -0.41977696, -0.43313342, -0.27060638,\n",
       "        -0.31679603, -0.34571956]),\n",
       " 'split1_test_score': array([-0.59788944, -0.59822635, -0.59834345, -0.5891495 , -0.58882085,\n",
       "        -0.5882385 , -0.59230999, -0.59065246, -0.58615128, -0.61229104,\n",
       "        -0.59923463, -0.59890078]),\n",
       " 'split1_train_score': array([-0.5757587 , -0.57598921, -0.57656175, -0.50441271, -0.51078955,\n",
       "        -0.51466603, -0.39286036, -0.41699971, -0.42990183, -0.26818691,\n",
       "        -0.31642813, -0.34297515]),\n",
       " 'split2_test_score': array([-0.59865445, -0.5980279 , -0.5985676 , -0.59092126, -0.58902976,\n",
       "        -0.5897261 , -0.59243385, -0.59183865, -0.59077781, -0.61353125,\n",
       "        -0.60773449, -0.59771487]),\n",
       " 'split2_train_score': array([-0.57517578, -0.57595231, -0.57636705, -0.5041572 , -0.50969429,\n",
       "        -0.5147493 , -0.39431338, -0.41798849, -0.43055517, -0.26940278,\n",
       "        -0.31777802, -0.34723413]),\n",
       " 'split3_test_score': array([-0.60386804, -0.60365716, -0.60401292, -0.59214589, -0.59216819,\n",
       "        -0.59099069, -0.59253407, -0.59604272, -0.59424203, -0.60932152,\n",
       "        -0.60412093, -0.6014713 ]),\n",
       " 'split3_train_score': array([-0.57475471, -0.57525246, -0.57614409, -0.50411979, -0.50987679,\n",
       "        -0.51324275, -0.39588198, -0.42002114, -0.43416004, -0.26633979,\n",
       "        -0.31231812, -0.3413914 ]),\n",
       " 'split4_test_score': array([-0.60175068, -0.60223514, -0.60324204, -0.59397766, -0.59400156,\n",
       "        -0.59285515, -0.5942078 , -0.59508886, -0.59663856, -0.61354669,\n",
       "        -0.60828636, -0.60389445]),\n",
       " 'split4_train_score': array([-0.57445099, -0.57537368, -0.57561486, -0.50368557, -0.50854883,\n",
       "        -0.51374214, -0.39353603, -0.41614024, -0.43227048, -0.26447135,\n",
       "        -0.31596021, -0.34429774]),\n",
       " 'std_fit_time': array([28.44084982,  7.51701397,  8.09542673, 21.06623777, 21.42782623,\n",
       "        16.33722607, 26.65307061,  3.43946862,  1.48048724, 13.59945663,\n",
       "         6.33112515, 23.40164514]),\n",
       " 'std_score_time': array([0.16509336, 0.30900162, 0.15951409, 0.34019491, 0.24516555,\n",
       "        0.60855488, 0.32121456, 0.22056057, 0.16789391, 0.5912572 ,\n",
       "        0.03750334, 0.50142956]),\n",
       " 'std_test_score': array([0.0037815 , 0.00399817, 0.00392982, 0.00366975, 0.00348201,\n",
       "        0.0033093 , 0.00355034, 0.00397503, 0.00430068, 0.00555145,\n",
       "        0.00575354, 0.00433339]),\n",
       " 'std_train_score': array([0.0005199 , 0.00036037, 0.00042768, 0.00036949, 0.00073522,\n",
       "        0.00060002, 0.00107699, 0.00151857, 0.00158198, 0.00218204,\n",
       "        0.00186723, 0.0020414 ])}"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.588982 using {'max_depth': 5, 'min_child_weight': 5}\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAELCAYAAADz6wBxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xl8VNX9//HXZyaTjbBvskhBEEEWA0RALZagKIpFERdwA+purVW/pWi1Vaxarb8qaql1BURFBMWiRVZxqRsGDIi4EAUxgCwJa/ZkPr8/5iZMwiQZZjKZLJ/n4zGPzNx77r0nF3Lfc8+951xRVYwxxphQuaJdAWOMMfWbBYkxxpiwWJAYY4wJiwWJMcaYsFiQGGOMCYsFiTHGmLBYkBhjjAmLBYkxxpiwWJAYY4wJS0y0K1Ab2rRpo127do12NYwxpl5Zs2bNHlVtW125RhEkXbt2JS0tLdrVMMaYekVEfgymXESbtkRklIh8KyIZInJHJWUuEZGNIvKViLziN32JiOwTkbcrlO8mIp+JyCYRmScisZH8HYwxxlQtYkEiIm5gBnAOcCIwQUROrFDmeOBO4DRV7QPc6jf7EeDKAKt+GHhMVY8H9gJXR6D6xhhjghTJM5LBQIaq/qCqhcCrwPkVylwLzFDVvQCquqt0hqquBA76FxYRAUYAC5xJs4ELIlN9Y4wxwYjkNZJOwE9+nzOBIRXK9AQQkY8AN3Cvqi6pYp2tgX2qWuy3zk41U11jDEBRURGZmZnk5+dHuyqmlsTHx9O5c2c8Hk9Iy0cySCTAtIoPP4kBjgeGA52BD0Wkr6ruC2OdvoIi1wHXAXTp0iWY+hpjgMzMTJo2bUrXrl3xNQKYhkxVycrKIjMzk27duoW0jkg2bWUCx/p97gxsD1DmP6papKqbgW/xBUtl9gAtRKQ0AAOtEwBVfUZVU1Q1pW3bau9eM8Y48vPzad26tYVIIyEitG7dOqwz0EgGyefA8c5dVrHAeGBRhTJvAqkAItIGX1PXD5WtUH2Pc1wFXORMmgj8p4brbUyjZyHSuIT77x2xIHGuY9wMLAW+Bl5T1a9E5D4RGeMUWwpkichGfAExRVWzAETkQ2A+cIaIZIrI2c4yU4HbRSQD3zWT5yP1Oxx87z0Offgh9jhiY4ypXEQ7JKrqYmBxhWl/8XuvwO3Oq+KywypZ5w/47giLuOwXZpK7ejWxPbrTauJEmo8ZgysurjY2bYwx9YaNtVWFLs89S8eHH0I8sfz857+QkTqC3U/+k+KsrGhXzZgGa9++ffzrX/8Kadnp06eTm5tbwzWqGcOHDw95hI0333yTjRs3HtW68vPzGTx4MCeddBJ9+vThnnvuCWnbwbAgqYLExtL8/PPp9sbrdJk1i4T+/dkzYwYZqSPY8ec/U5CREe0qGtPgNNQgCUfFIAlGXFwc7777LuvWrSM9PZ0lS5bw6aefRqR+jWKsrXCJCE2GDqHJ0CEU/LCZ7Bdns3/hm+ybv4Amw4bRatJEmpx6ql2gNA3OtLe+YuP2AzW6zhM7NuOeX/epdP4dd9zB999/T3JyMiNHjqRdu3a89tprFBQUMHbsWKZNm0ZOTg6XXHIJmZmZlJSU8Oc//5mdO3eyfft2UlNTadOmDatWrQq4/qSkJH7729+yYsUKWrZsyYMPPsgf//hHtm7dyvTp0xkzZgxbtmzhyiuvJCcnB4B//vOfnHrqqSxcuJAZM2awfPlyfv75Z371q1/xwQcfcMwxxxyxnby8PCZPnszGjRvp3bs3eXl5ZfOWLVvGPffcQ0FBAd27d2fmzJkkJSXRtWtXLr300rK6v/LKK+zatYtFixbx/vvvc//99/P6668DMH/+fG666Sb27dvH888/z7Bh5a8GiAhJSUmAr29QUVFRxI5RdkZylOKO60aHe++lx3uraHvr78n/5mt+uvoaNo85n32vv4G3sDDaVTSmXnvooYfo3r076enpjBw5kk2bNrF69WrS09NZs2YNH3zwAUuWLKFjx46sW7eODRs2MGrUKG655RY6duzIqlWrKg0RgJycHIYPH86aNWto2rQpd999N8uXL2fhwoX85S++S7jt2rVj+fLlrF27lnnz5nHLLbcAMHbsWI455hhmzJjBtddey7Rp0wKGCMBTTz1FYmIi69ev56677mLNmjUA7Nmzh/vvv58VK1awdu1aUlJSePTRR8uWa9asGatXr+bmm2/m1ltv5dRTT2XMmDE88sgjpKen0717dwCKi4tZvXo106dPZ9q0aQBs376dc889t2xdJSUlJCcn065dO0aOHMmQIRX7hNcMOyMJUUzLlrS54QZa/eY3HPjvYrJnzmTHXXex67HHaHnZBFpOmEBMy5bRrqYxYanqzKE2LFu2jGXLljFgwAAADh06xKZNmxg2bBh/+MMfmDp1Kuedd94R38arEhsby6hRowDo168fcXFxeDwe+vXrx5YtWwDfN/ibb76Z9PR03G433333XdnyTz75JH379mXo0KFMmDCh0u188MEHZQHUv39/+vfvD8Cnn37Kxo0bOe200wAoLCzklFNOKVuudJ0TJkzgtttuq3T9F154IQCDBg0qq3fHjh1ZvPjw/U1ut5v09HT27dvH2LFj2bBhA3379g1qPx0NC5IwuWJjaTH2AppfcD65n3xC1qxZ7HniSbKefobmF1xAq4lXEXfccdGupjH1kqpy5513cv311x8xb82aNSxevJg777yTs846q+xsojoej6esicflchHn3InpcrkoLvaNvvTYY4/Rvn171q1bh9frJT4+vmz5bdu24XK52LlzJ16vF5er8oadQE1JqsrIkSOZO3dutctU1RRVWm+3211W78q0aNGC4cOHs2TJkogEiTVt1RARocmpp9LlmWc47u23aD5mDPsXLuSHc0fz0/U3kPPpp9YfxZggNG3alIMHfeO1nn322bzwwgscOnQI8B3Ed+3axfbt20lMTOSKK67gD3/4A2vXrj1i2XDs37+fDh064HK5mDNnDiUlJYCvOWny5Mm88sor9O7du1yTVEWnn346L7/8MgAbNmxg/fr1AAwdOpSPPvqIDOdmndzc3HJnPPPmzSv7WXqmEsrvtXv3bvbt8402lZeXx4oVK+jVq9dRrSNYdkYSAXE9etDhr/fR9tbfs/fVV9n7yly2TppMXK9etJo0kebnnovE2mNUjAmkdevWnHbaafTt25dzzjmHyy67rOyAmpSUxEsvvURGRgZTpkzB5XLh8Xh46qmnALjuuus455xz6NChQ5XXSapz0003MW7cOObPn09qaipNmjQB4MEHH2TYsGEMGzaM5ORkTj75ZEaPHk3v3r2PWMeNN97I5MmT6d+/P8nJyQwe7Ov+1rZtW2bNmsWECRMoKCgA4P7776dnz54AFBQUMGTIELxeb9lZy/jx47n22mt54oknWLBgwRHbKrV9+3auueYaFi9ezI4dO5g4cSIlJSV4vV4uueQSzjvvvJD3SVWkMXxLTklJ0Wg+IdFbUMCBt98me9YsCjZlENO2LS0vv5wWl15i11FMnfP1118HPDCayCt9mmubNm1qfduB/t1FZI2qplS3rDVt1QJXXBwtxo2j26JFHPvss8T17Mnu6dN9/VGmTaNg8+ZoV9EYY0JmTVu1SERIGvZLkob9kvzvviN79mz2L3idfa/OIyk1lVaTJpJ48snWH8WYGjBkyJCypqNSc+bMoV+/fjW6naVLlzJ16tRy07p168bChQuPel2ld1/VN9a0FWXFe/aw95W57J07l5K9e4k/8URaTZ5Es1GjkBAfMmNMOKxpq3Gypq16LKZNG9re8jt6rHqXY+6bhjc/n+1T/kjGmSPZ8+yzlOzfH+0qGmNMlSxI6ghXfDwtL7mE495+i2OfeZq47sex+x+Psil1BD//9X4Kf/wx2lU0xpiA7BpJHSMuF0mnn07S6aeT/803ZM+azd7XXmPvK6+QdMYIWk+eTMLAgXYdxRhTZ9gZSR0W36sXHR/6Gz1WrqD19deR93kaP15+BVsuuZT9//0vWlQU7SoaY4wFSX3gadeOdrfeSo/3VnHMvffgPXiQ7f/3BzLOOpus51+g5EDNjs5qTDQ11GHka/t5JODrl9KvXz+Sk5NJSan2mnnILEjqEVdCAi3Hj+e4xf+l81P/IrZLF3Y98ggZw1P5+cEHKczMjHYVjQlbQw2ScITyPJJSq1atIj09PeQQC4ZdI6mHxOWiaWoqTVNTyd+4kezZs323EL/0Mk1HjvT1R3FGSzUmLO/cAT9/WbPrPKYfnPNQpbPteSQ18zyS2mRnJPVc/Ikn0vHhh33XUa6+mpxPPuHHCZex5dLxHFiyBK1mVFBj6hp7HknNPY9ERDjrrLMYNGgQzzzzTBj/KlWzM5IGwtO+Pe3+73ba3HA9+958k+zZL7Lt1tvwdOxIy6uupMVFF+F2npZmTNCqOHOoDfY8kvCeR/LRRx/RsWNHdu3axciRI+nVqxenn356UPvpaFiQNDCuJk1odfnltBw/nkPvvUf2zFnseuhh9jz5T1pcfDGtrrwCT6dO0a6mMUGx55GE9zySjh07Ar4zrLFjx7J69eqIBIk1bTVQ4nbT9Iwz+MVLc+g6fz5Jqalkz5lDxllnk3nbbeStWxftKhoTkD2PpGaeR5KTk1O2TE5ODsuWLYvIQ63AzkgahYR+fen0/x6h3f/dTvZLL7HvtfkcfGcJCQMH0mrSRJqecQbidke7msYA9jySmnoeyc6dOxk7dizgC8DLLrusrEmvptmgjY1QyaEc9r/xBtkvvkhRZiaezp1pddVVNL/wQtxJTaJdPRNlNmhj9NjzSEy94U5qQqurrqT70iV0euJxYtq1Y+eDD5KRmsrORx6haMeOaFfRGFOPWNNWIyZuN83OOotmZ51F3rp1ZM+eTfYs36vZqFG0mjSJhH6RaVM1JtLseSS1x5q2TDlF27aRPecl9s2fjzcnh4SUQbSeNImk1FS7jtJIWNNW42RNW6bGeDp1ov0dU+nx/nu0u2Mqxdt3kHnz7/j+3HPJfvllvA1w+AljTHgsSExA7qQkWk+aRPdlS+k0/THcLVqw86/3syl1BLv+8ShFO3dGu4rGmDrCgsRUSWJiaDZqFN3mzeMXc1+hydChZD3/PBlnnMm2P/6R/BAHkjPGNBwWJCZoiQMG0Pnx6XRftpRWl1/GoRUr2XzhOH68aiIH312Fer3RrqJpABrq6L+1PYz8t99+S3JyctmrWbNmTJ8+PaTtV8eCxBy12M6daX/nnb7rKFOmUPjTT2TedBM/nDuavXPn4vUb5dSYo9VQgyQcoQwjf8IJJ5Cenl422GViYmJZB8WaZkFiQuZu2pTWV/+GHsuW0vEf/w9XUhI/T7uPjOGp7Jo+naJdu6JdRVMP+Q8jP2XKFB555BFOPvlk+vfvzz333AP4hvwYPXo0J510En379mXevHk88cQTZcPIp6amVrr+pKQkpk6dyqBBgzjzzDNZvXo1w4cP57jjjmPRokWA7zbcYcOGMXDgQAYOHMjHH38MwMKFCznzzDNRVXbs2EHPnj35+eefA24nLy+P8ePH079/fy699NIjhpE/5ZRTGDhwIBdffHHZEDBdu3Zl6tSpDB48mMGDB5ORkcHHH3/MokWLmDJlCsnJyXz//feAbxj5wYMH07NnTz788MMq9+nKlSvp3r07v/jFL4L8Vzg61o/EhE08HpqPHk2zc88lb+1asmfNIuvpZ8h6/gWajx5Nq0kTie/VK9rVNCF4ePXDfJP9TY2us1erXkwdPLXS+Q899BAbNmwgPT2dZcuWsWDBAlavXo2qMmbMGD744AN2795Nx44d+e9//wv4xsZq3rw5jz76KKtWraqyZ3jpMPIPP/wwY8eOLRtGfuPGjUycOJExY8aUDSMfHx/Ppk2bmDBhAmlpaYwdO5bXX3+dGTNmsGTJkqCHkV+/fj0DBw4Eyg8j36RJEx5++GEeffTRskEnS4eRf/HFF7n11lt5++23GTNmDOeddx4XXXRR2fpLh5FfvHgx06ZNY8WKFeWGSPH36quvVjlScbgsSEyNERESBw0icdAgCrduJfvFOex74w32v/kmiacMpfWkSTQZNgypYrRUY/zZMPLhDSNfuv5Fixbxt7/9rdp9EyoLEhMRsV26cMzdd9H2dzezb/58sue8xE/X30Bs9+60mngVzceMweU3NLepm6o6c6gNNox8eMPIA7zzzjsMHDiQ9u3bV1omXPbV0ESUu3lzWl9zDT1WLKfjI3/HFRfHz3+5h4zUEex+4kmK9+yJdhVNHWPDyNfMMPKl5s6dG9FmLbAgMbVEPB6a//rXdH19AV1enE3CgAHseeopMlJHsP2uu8j3+0MyjZv/MPLLly8vG0a+X79+XHTRRRw8eJAvv/ySwYMHk5yczAMPPMDdd98NHB5GvqqL7cG46aabmD17NkOHDuW7774LOIz8o48+ynPPPcfXX38dcB033ngjhw4don///vz9738POIx8//79GTp0KN98c/g6VOkw8o8//jiPPfYY4BtG/pFHHmHAgAFlF9sDqfio3dzcXJYvX17WDBYpER1rS0RGAY8DbuA5VT3iuZ0icglwL6DAOlW9zJk+EbjbKXa/qs52pr8HdABKb4E4S1WrvD3Ixtqqmwo2b2bvnDnse2Mhmp9Pk9NOo9WkSTT55WlVntKbyLKxtqLHhpGvQETcwAzgHOBEYIKInFihzPHAncBpqtoHuNWZ3gq4BxgCDAbuEZGWfoterqrJzsvuMa2n4rp145i//IUeq96l7W23UfDdd/x07bVsHjOGfQsW4K0wcqsxpm6KZNPWYCBDVX9Q1ULgVeD8CmWuBWao6l4Av1A4G1iuqtnOvOVAZB7tZaIupmVL2lx/HT1WrqDjww+BO4Ydd/+ZjBFnsHvGDIqzs6NdRVMPDRkypFzP7uTkZL788ssa387SpUuP2E6oHf+2bNkSlbORcEXyrq1OwE9+nzPxnWH46wkgIh/ha/66V1WXVLJsJ7/PM0WkBHgdX7NXwx8LvxGQ2Fian38+zcaMIfezz8ieOYs9T/6TrKefofn559Nq4lXE9egR7WqaeuKzzz6rle2cffbZnH322bWyrboqkkESqJG74gE/BjgeGA50Bj4Ukb7VLHu5qm4Tkab4guRK4MUjNi5yHXAdQJcuXUKpv4kSEaHJ0KE0GTqUgh9+IHv2i+x/8032zZ9Pk9OH0XrSJBJPOcWuoxhTR0SyaSsTONbvc2dge4Ay/1HVIlXdDHyLL1gqXVZVtzk/DwKv4GtCO4KqPqOqKaqa0rZt2xr4dUw0xB13HB2m3UuP91bR9ve3kL/xa7b+5mo2n38B+95YiLewMNpVNKbRi2SQfA4cLyLdRCQWGA8sqlDmTSAVQETa4Gvq+gFYCpwlIi2di+xnAUtFJMYph4h4gPOADRH8HUwdEdOyJW1uvJEe766kw4MPArDjT38i44wz2PPvf1O8d2+Ua2hM4xWxIFHVYuBmfKHwNfCaqn4lIveJyBin2FIgS0Q2AquAKaqaparZwF/xhdHnwH3OtDh8gbIeSAe2Ac9G6ncwdY8rNpYWF46l23/e5NjnnyO+d292T3+cjNQR7Lj3Xgp+2BztKhrT6ES0Q6KqLlbVnqraXVUfcKb9RVUXOe9VVW9X1RNVtZ+qvuq37Auq2sN5zXSm5ajqIFXtr6p9VPX3qloSyd/B1E0iQtJpp9HlmWc47q1FNP/1eex/YyE/nHsuP91wIzmffobdg1E/NdRh5Gv7eSQAjz/+OH379qVPnz4RexYJWM920wDEHX88Hf76V3qsepc2N99M3vr1bJ00ic0XjmP/f/6D2nWUeqWhBkk4QnkeyYYNG3j22WdZvXo169at4+2332bTpk0RqZ8FiWkwYlq3pu3Nv6XHqnfpcP9f0aJCtk+9g4wzzmTP089Qsm9ftKtogmDPI6mZ55F8/fXXDB06lMTERGJiYvjVr37FwoULQ/gXqZ6N/msaHFdcHC0uuojm48aR87+PyJ45k92PPcaef/+bFmPH0uqqK4nt2jXa1awXfn7wQQq+rtnnkcT17sUxf/pTpfPteSQ18zySvn37ctddd5GVlUVCQgKLFy8mJaXa0U5CYkFiGiwRIWnYL0ka9kvyv/2O7Nmz2Td/PnvnziVpxAhaT5pIQkqK9Uepw+x5JKE/j6R3795MnTqVkSNHkpSUxEknnURMTGQO+RYkplGIP6EnHR98gHa33creuXPZ+8pcfly5kvg+fWg1aRLNRp2NeDzRrmadU9WZQ22w55GE9zySq6++mquvvhqAP/3pT3Tu3LnS9YXDrpGYRiWmbVva3nILPd5bxTHTpuHNzWX7lClkjDyLrOeeo2T//mhXsdGz55HU3PNIdu3yDV+4detW3njjjYg9l8TOSEyj5IqPp+Wll9Di4ovI+fBDsmbNYtf/+we7//UULS68kFYTryL22GOrX5Gpcf7PIznnnHPKnkcCvgvlL730EhkZGUyZMgWXy4XH4+Gpp54CDj+PpEOHDqxatSrkOtx0002MGzeO+fPnk5qaGvB5JMnJyZx88smMHj064LD7N954I5MnT6Z///4kJycHfB5JgTPC9f3330/Pnj2Bw88j8Xq9ZWct48eP59prr+WJJ55gwYIFlda74jPbx40bR1ZWFh6PhxkzZtCyZctKlw1HRJ9HUlfY80hMMPK/+YbsmbPYv3gxFBfT9MwzaTV5EgkDBjSq6yj2PJLoseeRGFPPxffqRceHH6LHihW0vu46clev5sfLLmfLpeM5sHgxWsVzsY1pzKxpy5gKPO3b0e62W2lz/XXs/89/yJ41m223/x8xHTvQ6ooraXHxRbibNo12NU01hgwZUtZ0VGrOnDn069evRrezdOlSpk6dWm5at27dQuqzUXr3VX1jTVvGVEO9Xg699z7Zs2aRu3o1riZNaHHROFpeeSWxEboLJpqsaatxsqYtYyJIXC6ajkjlFy/OpuvrC0g6YwTZL7/C92edTebvbyUvPT3aVaxxjeELpjks3H9vCxJjjkJCnz50+vvf6bFyBa2v/g05n3zClvET2DJ+AgeWLG0Q11Hi4+PJysqyMGkkVJWsrKxyfWWOljVtGRMGb04O+xa+SfaLL1K0dSueTp1oddWVNB83DndSUrSrF5KioiIyMzPJz8+PdlVMLYmPj6dz5854KnTKDbZpy4LEmBqgJSUcWrWKrFmzyEtbgyspiRYXX0yrK6/A07FjtKtnTEgsSPxYkJjalPfll2TPms2BJUsAaHb22b7+KDV8t5AxkWZB4seCxERD0fbtZL/8Mvtem4/34EESBg2i1aSJNB0xAnG7o109Y6plQeLHgsREU8mhHPa/8TrZs1+kaNs2PMceS6urrqLFhWNxOUNvGFMXWZD4sSAxdYGWlHBwxUqyZ80i74svcDVrRvMLzqfJKaeQOGgQ7mbNol1FY8qxIPFjQWLqmrz0dLJmzebQypVoURGIENerF4kpKSSenEJiSgoxrVpFu5qmkbMg8WNBYuoqb34+eevWk5v2OblpaeR9kY46t93Gdu/uhMrJJJ58Mp727aJcW9PYWJD4sSAx9YUWFpL31Vfkfp5Gbtrn5K1ZizcnBwBPly7lg6VTx0Y1KrGpfRYkfixITH2lxcXkf/Ot74zl8zTy0tLKHr4V06GDX1PYycR262rBYmqUBYkfCxLTUKjXS8GmjLJgyU1Lo2TPHgDcbdqUC5a443sgVTwG1pjqWJD4sSAxDZWqUrhlC7mf+66x5H6eRvGOHQC4mzcnISXFCZeTie91AhJjT44wwQs2SOx/lTH1mIgQ160bcd260fKSS1BVirZtd4LFd9ZyaOVKAFxNmpAwaKDvGktKCgl9+yCxsVH+DUxDYGckxjRwRTt3OmcrvrOWwozvAZD4eBKSk8uawhJO6o8rjBFgTcNjTVt+LEiMOaw4O7usGSw3LY2Cb74BVcTjIb5//7KmsMQBydbzvpGzIPFjQWJM5Ur27yd37dqycMn/6isoKQG3m/g+fQ5fwLfe942OBYkfCxJjgufNySH3i/Syayz569cf2fveCRfrfd+w1ViQiEh3IFNVC0RkONAfeFFV99VITWuBBYkxofPm55O3fn3ZNRbrfd941GSQpAMpQFdgKbAIOEFVz62BetYKCxJjak7wve9T8HTqZJ0k67GaDJK1qjpQRKYA+ar6pIh8oaoDaqqykWZBYkzkWO/7hqsm+5EUicgEYCLwa2eap4ryxphGRGJiSOjbh4S+fWg9adIRve9zPvmEA2+9Bfj1vnfuDLPe9w1DMEEyGbgBeEBVN4tIN+ClyFbLGFNfictF/Ak9iT+hJ60uvzxg7/uDzmOIrfd9w3BUd22JSEvgWFVdH7kq1Txr2jKm7jii931aGkU/bgWc3vcDB/r6sVjv+6iryWsk7wFj8J29pAO7gfdV9fYaqGetsCAxpm6z3vd1U00GyReqOkBErsF3NnKPiKxX1f41VdlIsyAxpn6x3vd1Q00GyZfAWcBs4C5V/dyCxBhTm0oOHCB3zRrrfV/LavKurfvw9R/5yAmR44BNQVZiFPA44AaeU9WHApS5BLgXUGCdql7mTJ8I3O0Uu19VZzvTBwGzgARgMfB7bQzd841pxNzNmtE0NZWmqalAhd73aWnsnTOH7BdesN73URKxIVJExA18B4wEMoHPgQmqutGvzPHAa8AIVd0rIu1UdZeItALS8HWEVGANMMgpsxr4PfApviB5QlXfqaoudkZiTMMWfO/7FDzt20e5tvVHjZ2RiEhn4EngNHwH9f/hOwvIrGbRwUCGqv7grOdV4Hxgo1+Za4EZqroXQFV3OdPPBpararaz7HJglHPhv5mqfuJMfxG4AKgySIwxDZsrPp4mgwfTZPBgwK/3vXMB/8Bbb7Pv1XmA0/u+9BqL9b6vEcE0bc0EXgEudj5f4UwbWc1ynYCf/D5nAkMqlOkJICIf4Wv+uldVl1SybCfnlRlgujHGlJHYWBIHDCBxwAC49tojet8fWrmS/W+8AVjv+5oQTJC0VdWZfp9nicitQSwX6F+iYjtaDHA8MBzoDHwoIn2rWDaYdfo2LnIdcB1Aly5dgqiuMaahqrL3fZr1vg/QICZeAAAYEUlEQVRXMEGyR0SuAOY6nycAWUEslwkc6/e5M7A9QJlPVbUI2Cwi3+ILlkx84eK/7HvO9M7VrBMAVX0GeAZ810iCqK8xppGw3vc1K5jbf7sA/wROwfft/2PgFlXdWs1yMfgutp8BbMN3sf0yVf3Kr8wofBfgJ4pIG+ALIJnDF9gHOkXX4rvYni0inwO/Az7Dd7H9SVVdXFVd7GK7MeZoFWZuc5rCGm/v+xq72O4ExpgKK78VmF7NcsUicjO+W4fdwAuq+pWI3AekqeoiZ95ZIrIRKAGmqGqWs42/4gsfgPtKL7wDN3L49t93sAvtxpgIiO3cidjOnWhxwQXAkb3vdz/6KODX+945Y2mMve9Duv1XRLaqar258GBnJMaYmlbW+95pCqvp3vfFJV7yi73kF5WQV1hCQXEJeYVe8opKfNOcn75XhemFh6fdfV5v2jUNLdhqskNiwPWHuJwxxtRbXq+SX+wcpF0J5A84lbw+Qyi4vIT87P14v0zH/WU6cRvXkfvss8jTT+N1udjfuTs7u/Vme5de/NixBwdiEgMGgf+0opLQLu3GxrhI8LiJ9/h+5haUQNMa3hEVhBokdvHaGFMnqCoFpd/cSw/KhSW+A77z0/+bfH65b/Tlp+cVHjnN/3NBsbea2sSCezD0G0x87wJ6Z/9Ivz3f0z97Mz0//C+9vIvwImxv3YkfO53AT11OYGfX3mibFiR43CTEuomL8f2Mj3GTEOsi3uMueyU4r3jP4em+sq6yZd2u2v+eX2mQiMhBAgeG4Ls+YYwxAakqRSVKXlEJBc5Bu6qDfMWmGv+DfNnyzkG+Ypn84hJCGaDDJZQdvP0P1PEeF03jY2jbNK7cN/v4soP74QN3+eUqP8jHuF3let8npaVx7BcfoetXAk7ve/9OkvWs933EhkipS0K9RrI/t4girxeXCC4BQRAXZZ9dIoiUfnbKWEcmU4cVl3gPH4D9Dsi+g7vXry2+dF7FA3f5aflVHOS9IRxaRCg7WCd43MSVHsQDHaT9DtTlDvLOMnHlvsH7Le+U9bglqn+vFXvf561ZizcnB6g7ve9rbPTfhiDUIJk0czXvfbv7qJc7HC6+YHH5hY3/vNLPR1umfPmK84JZX+ly1ZcJvM7Sz840l1OG6su4RBAqhnDp/COXLy3rclX1uzvlXBW2GTDogykTeL8GKnO0/4aBlHj1yG/ZAQ7yh7/BB2iSqeIgn1/kWzavqITiUI7uQFzpN/AY/2/w5Q/yFQ/6vqaWisu5AjTTHF4+LsbVaL+Mlet9n5ZG3udplOzfD/j1vnfCpbZ631uQ+Ak1SN79Zifb9ubhVfCq4lXfKbv6ffaqon7vA5XxzfcvXzqvdH5VZQ5v48h1BtiGF5Tqy5Ruo7TsEfXyll9eqbA+b6A6Hrk+U17FsFGFwpLq2t0Di3W7yg7MpQfr+Fg3CaXT/NrWKx704/2bZyoc5Mt/g/eFgSsK7e6NnXq9FGRklOskWbJnD1B7ve8tSPzY7b/RETh0DweTVxX1VgxV//BzwumI4D2yTMXwraxMqF8GKivj9TrvqeTLgLfClwHKr1OQsoO8fxj4t8H7N+n4h0M0Lqqa6AnU+754xw6gQu/7lBTie/eqkd73FiR+LEiMMQ1RML3vW1w4lpg2bUJaf00OIx/o7q39+J4X8n+lw8QbY4ypXZX2vncu4O9+9FGanXtuxOsRzLnPo/gGRnwF362/44FjgG+BFyg/uKIxxpgo8bRvT/PRo2k+ejQAxXv3EtOyZcS3G8zVmVGq+rSqHlTVA86ouueq6jwg8jU0xhgTktoIEQguSLwicomIuJzXJX7zGv4FFmOMMVUKJkguB64EdjmvK4ErRCQBuDmCdTPGGFMPBDOM/A/AryuZ/b+arY4xxpj6ptozEhHpLCILRWSXiOwUkddFpHN1yxljjGkcgmnamgksAjoCnYC3nGnGGGNMUEHSVlVnqmqx85oFtI1wvYwxxtQTwQTJHhG5QkTczusKICvSFTPGGFM/BBMkvwEuAX4GdgAXAZMjWSljjDH1R7VBoqpbVXWMqrZV1XaqegFwYS3UzRhjTD0Q6rjDt9doLYwxxtRboQaJjV9tjDEGCD1IbGgUY4wxQBU92ysZPh58ZyMJEauRMcaYeqXSIFHVprVZEWOMMfVTzT/k1xhjTKNiQWKMMSYsFiTGGGPCYkFijDEmLBYkxhhjwmJBYowxJiwWJMYYY8JiQWKMMSYsFiTGGGPCYkFijDEmLBYkxhhjwmJBYowxJiwWJMYYY8JiQWKMMSYsEQ0SERklIt+KSIaI3BFg/iQR2S0i6c7rGr95D4vIBud1qd/0WSKy2W+Z5Ej+DsYYY6pW6fNIwiUibmAGMBLIBD4XkUWqurFC0XmqenOFZUcDA4FkIA54X0TeUdUDTpEpqrogUnU3xhgTvEiekQwGMlT1B1UtBF4Fzg9y2ROB91W1WFVzgHXAqAjV0xhjTBgiGSSdgJ/8Pmc60yoaJyLrRWSBiBzrTFsHnCMiiSLSBkgFjvVb5gFnmcdEJC4itTfGGBOUSAaJBJhW8RnwbwFdVbU/sAKYDaCqy4DFwMfAXOAToNhZ5k6gF3Ay0AqYGnDjIteJSJqIpO3evTvMX8UYY0xlIhkkmZQ/i+gMbPcvoKpZqlrgfHwWGOQ37wFVTVbVkfhCaZMzfYf6FAAz8TWhHUFVn1HVFFVNadu2bY39UsYYY8qLZJB8DhwvIt1EJBYYDyzyLyAiHfw+jgG+dqa7RaS1874/0B9Y5r+MiAhwAbAhgr+DMcaYakTsri1VLRaRm4GlgBt4QVW/EpH7gDRVXQTcIiJj8DVbZQOTnMU9wIe+rOAAcIWqljZtvSwibfGdpaQDN0TqdzDGGFM9Ua142aLhSUlJ0bS0tGhXwxhj6hURWaOqKdWVs57txhhjwmJBYowxJiwWJMYYY8JiQWKMMSYsFiTGGGPCYkFijDEmLBYkxhhjwmJBYowxJiwWJMYYY8JiQWKMMSYsFiTGGGPCYkFijDEmLBYkxhhjwmJBYowxJiwWJMYYY8JiQWKMMSYsFiTGGGPCYkFijDEmLBYkxhhjwmJBYowxJiwWJMYYY8JiQWKMMSYsFiTGGGPCYkFijDEmLBYkxhhjwmJBYowxJiwx0a6AMXWdqlLsLSa/JJ+CkgLyi52fJfkUFB/+ecQ0v7KBlisoKUBRmsY2JcmTRNPYpuVfHt/PpFjfvGaxzUjyJBHnjkNEor1bjCljQWLqHa96fQfnIA/YpWWO5gBfcVmvekOqqyDEx8QT544jzh1X9j7eHU9cTByCsDt3N5uLNnOw8CAHCw9SoiVVrtPj8pQLm9KgqRg+pcFTMaCaeJrgEmuMMDXHgsSErchbVO0Bu9xBOswDfaG3MOS6xrhifAdxv4N66fvEmERaxbUiLiau3MG+svKBypS9d356XJ6jOntQVfKK8zhYeJBDRYc4WHiQA4UHOFToe3+w6GBZ4BwqPMSBIt+8Xbm7ypbJK86rchuClAVMWQh5DgdNVSGU5PHN87g9If8bmIbHgqSBUdWQvplX9W28ugN8dd+gq1J60A10UG4R3+KIg3hV5YM50Ltd7hrc2zVPREj0JJLoSaQ97UNaR5G36HDw+IXPocJDHCg8UC6kSl87cnawad+mstBStMptxLvjKw2hitP8Q6i0iS4hJsGa5xoQC5IIK/YWB33ADvgt/CgP9AUlBSHXtapv6wkxCbSMaxn2t3X/MrGuWDuYRIDH5aFlfEtaxrcMaXmvesktyg06hErPmrYd2lb2ubqzRre4SYpNKjvDqew6Uen8is13SbFJxLjs8FVX2L9EFd7d+i5bD2wNuV29oLiAYi0OeftVfftuHt+c9u72jerbuqkdLnH5DvKxSXSgQ0jrKCgpKNcEd7DwYFkzXLkQKjo8/6dDP5VNzynKqXYbCTEJ5W5C8G+Wq3gGFOhMyW5aqDkWJFV4fdPrfJD5AVD1t/W4mDiaxzU/+nb0ykLAvq2bei7OHUdcQhxtEtqEtHyJt4RDRYcCnv0cKvI7O/K7dpSVn8WWA1vKplX3JS7GFVPltaCKd9CVCynnbMpuWvCxIKnCw8MexiUuYt2xdhptTC1yu9w0j2tO87jmIS2vquSX5AcMoapuYNidu7tsWjA3LTTxNKm2GS7QLdyl82PdsSH9fnWNHR2rkBSbFO0qGGNCICIkxCSQEJNAu8R2Ia2j9KYF/7vjAjXLlYVS0UF+zv2Zg/sOh1Z1t43HueNCDqGmsU1JjEmsEy0XFiTGGBNAuDctqCq5xblBNcv5X0/afmh72ZlTdTfPuMRVZTNcUmwS408YT+uE1iH9DsGyIDHGmAgQ8TV9NfE04Zgmx4S0jsKSwqMKoQOFB8g8lFlumV8f92sLEmOMaaxi3bG0TmgdchCUeEtq5YYACxJjjGmgauuW/ohGlYiMEpFvRSRDRO4IMH+SiOwWkXTndY3fvIdFZIPzutRvejcR+UxENonIPBFpGLc9GGNMPRWxIBERNzADOAc4EZggIicGKDpPVZOd13POsqOBgUAyMASYIiLNnPIPA4+p6vHAXuDqSP0OxhhjqhfJM5LBQIaq/qCqhcCrwPlBLnsi8L6qFqtqDrAOGCW++9xGAAuccrOBC2q43sYYY45CJIOkE/CT3+dMZ1pF40RkvYgsEJFjnWnrgHNEJFFE2gCpwLFAa2CfalmX1crWaYwxppZE8mJ7oF4yFYcUfQuYq6oFInIDvjOMEaq6TEROBj4GdgOfAMVBrtO3cZHrgOsAunTpEtpvsG4e7N0C7hhwecAd6/fe+eyKOcr3Ht86St+73FAHOhQZY0yoIhkkmfjOIkp1Brb7F1DVLL+Pz+K7/lE67wHgAQAReQXYBOwBWohIjHNWcsQ6/ZZ/BngGICUlpeoxsSuzYQFsWhbSokclUMBU+t551ch7C0JjTPgiGSSfA8eLSDdgGzAeuMy/gIh0UNUdzscxwNfOdDfQQlWzRKQ/0B9YpqoqIquAi/Bdc5kI/Cdiv8Hl88FbAiVF4C3y/Tzq94XgLT7K90VQUlz5+6K86suUvg/xyX5HJZggLDuj8zjBVBPvQwnQ2PL1sSA0JmwRCxJVLRaRm4GlgBt4QVW/EpH7gDRVXQTcIiJj8DVbZQOTnMU9wIfOGDIHgCv8rotMBV4VkfuBL4DnI/U7AL4DjcsNxEd0MxHj9TrhUugEXHEQ70MNzSK/bRVX/r44v/oype9rIwgDBUyl72s4CGNiISYBPPHgSYSYePAk+F4xpdPiLOxMnSaqobX61CcpKSmalpYW7WqYUNTFIDyadYbx9MjDpHyweOKd8KksgPzmlb33n+e/TGL5zzHx4LKh0Y2PiKxR1ZTqylnPdlO3uVzgivN9K6+PyoKwkubM4gLfGVpRnu9VnOf3Ph+KcqHI+VmunN+8vH3OZ/9yuaGfzZUGyhGh5X+mVDG0KkwPOC/xyOCzh6k1CBYkxkRStIJQ1RdY/sFUFlT5R4ZWuXm55YPK//2hXYEDzRvik0DdsdWcQVUSWgHPrqoJLbenZvexKWNBYkxDJOJcf4mF+NAeDnVUSor8gqWys6tgQqu0TD7kZgeeV1L18+Ar5YoJotnvKJsEK2tidMc2qutaFiTGmPCV3hlHs2qLhs1bEkRoVWwSDBBa/s2F+QegeNeRoVWcH1odxRVmk2BVoVX3bsawIDHG1C8uN8Ql+V6R5vX6wqSy0Aq2SdA/tApzITfr8JmX//oC96+uhlQRRgkw5p/Q8hc1vWfKsSAxxpjKuFwQm+h7RZqqc/NFmE2CFW/MqIUbGixIjDGmLhBxziLiISG0x/tGi90wbowxJiwWJMYYY8JiQWKMMSYsFiTGGGPCYkFijDEmLBYkxhhjwmJBYowxJiwWJMYYY8LSKJ5HIiK7gR9DXLwNvkf81jVWr6Nj9To6Vq+j01Dr9QtVbVtdoUYRJOEQkbRgHuxS26xeR8fqdXSsXkensdfLmraMMcaExYLEGGNMWCxIqvdMtCtQCavX0bF6HR2r19Fp1PWyayTGGGPCYmckxhhjwmJBAojICyKyS0Q2VDJfROQJEckQkfUiMrCO1Gu4iOwXkXTn9ZdaqtexIrJKRL4Wka9E5PcBytT6PguyXrW+z0QkXkRWi8g6p17TApSJE5F5zv76TES61pF6TRKR3X7765pI18tv224R+UJE3g4wr9b3V5D1isr+EpEtIvKls820APMj+/eoqo3+BZwODAQ2VDL/XOAdQIChwGd1pF7DgbejsL86AAOd902B74ATo73PgqxXre8zZx8kOe89wGfA0AplbgL+7bwfD8yrI/WaBPyztv+POdu+HXgl0L9XNPZXkPWKyv4CtgBtqpgf0b9HOyMBVPUDILuKIucDL6rPp0ALEelQB+oVFaq6Q1XXOu8PAl8DnSoUq/V9FmS9ap2zDw45Hz3Oq+LFyfOB2c77BcAZIiJ1oF5RISKdgdHAc5UUqfX9FWS96qqI/j1akASnE/CT3+dM6sABynGK0zTxjoj0qe2NO00KA/B9m/UX1X1WRb0gCvvMaQ5JB3YBy1W10v2lqsXAfqB1HagXwDinOWSBiBwb6To5pgN/BLyVzI/K/gqiXhCd/aXAMhFZIyLXBZgf0b9HC5LgBPqmUxe+ua3FN4TBScCTwJu1uXERSQJeB25V1QMVZwdYpFb2WTX1iso+U9USVU0GOgODRaRvhSJR2V9B1OstoKuq9gdWcPgsIGJE5Dxgl6quqapYgGkR3V9B1qvW95fjNFUdCJwD/FZETq8wP6L7y4IkOJmA/zeLzsD2KNWljKoeKG2aUNXFgEdE2tTGtkXEg+9g/bKqvhGgSFT2WXX1iuY+c7a5D3gPGFVhVtn+EpEYoDm12KxZWb1UNUtVC5yPzwKDaqE6pwFjRGQL8CowQkReqlAmGvur2npFaX+hqtudn7uAhcDgCkUi+vdoQRKcRcBVzp0PQ4H9qroj2pUSkWNK24VFZDC+f8+sWtiuAM8DX6vqo5UUq/V9Fky9orHPRKStiLRw3icAZwLfVCi2CJjovL8IeFedq6TRrFeFdvQx+K47RZSq3qmqnVW1K74L6e+q6hUVitX6/gqmXtHYXyLSRESalr4HzgIq3ukZ0b/HmJpaUX0mInPx3c3TRkQygXvwXXhEVf8NLMZ310MGkAtMriP1ugi4UUSKgTxgfKT/mBynAVcCXzrt6wB/Arr41S0a+yyYekVjn3UAZouIG19wvaaqb4vIfUCaqi7CF4BzRCQD3zfr8RGuU7D1ukVExgDFTr0m1UK9AqoD+yuYekVjf7UHFjrfj2KAV1R1iYjcALXz92g9240xxoTFmraMMcaExYLEGGNMWCxIjDHGhMWCxBhjTFgsSIwxxoTFgsQYY0xYLEiMqSOcocBD6mXvDF/esSbWZczRsiAxpmGYBHSsrpAxkWBBYkwFItJVRL4RkedEZIOIvCwiZ4rIRyKySUQGO6+PxfeAo49F5ARn2dtF5AXnfT9n+cRKttNaRJY563gav4H1ROQK8T10Kl1EnnZ6nyMih0TkHyKyVkRWOsOcXASkAC875ROc1fzOKfeliPSK5D4zjZsFiTGB9QAeB/oDvYDLgF8Cf8A37Mo3wOmqOgD4C/Cgs9x0oIeIjAVmAteram4l27gH+J+zjkU4Q7mISG/gUnwjuiYDJcDlzjJNgLXOSK/vA/eo6gIgDbhcVZNVNc8pu8cp95RTb2MiwsbaMiawzar6JYCIfAWsVFUVkS+BrvhGm50tIsfjG467dAw0r4hMAtYDT6vqR1Vs43TgQme5/4rIXmf6GfhGjf3cGT8pAd/zQsD3HIx5zvuXgEAjL5cqnbemdDvGRIIFiTGBFfi99/p99uL7u/krsEpVx4rvIVrv+ZU/HjhEcNcsAg12J8BsVb0zxOVLlda5BPtbNxFkTVvGhKY5sM15P6l0oog0x9ckdjrQ2rl+UZkPcJqsROQcoKUzfSVwkYi0c+a1EpFfOPNc+EYwBl9z2/+c9wfxPafemFpnQWJMaP4O/E1EPgLcftMfA/6lqt8BVwMPlQZCANOA00VkLb5nSGwFUNWNwN34Hp26HliOb8h3gBygj4isAUYA9znTZwH/rnCx3ZhaYcPIG1OPiMghVU2Kdj2M8WdnJMYYY8JiZyTGRJiITAZ+X2HyR6r622jUx5iaZkFijDEmLNa0ZYwxJiwWJMYYY8JiQWKMMSYsFiTGGGPCYkFijDEmLP8ftJBZeIVDKX0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x107e649d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_1.best_score_, gsearch2_1.best_params_))\n",
    "test_means = gsearch2_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label= 'test_max_depth:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png' )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
